#ifndef __LXZ_FTP_H__
#define __LXZ_FTP_H__

#define return_val_if_fail(p, ret)    if (!(p)){return (ret); }

#define EFTP_REPLY_SIZE 2048
#define EFTP_MAX_LEN_FILENAME 128
#define EFTP_BUF_MAX_SIZE 2048

typedef enum _eftp_transport_mode_e
{
    E_EFTM_PASV,
    E_EFTM_PORT
} eftp_transport_mode_e;

typedef enum _eftp_socket_state_e
{
    E_EFSS_IDLE,
    E_EFSS_CONNECT,
    E_EFSS_CLOSING
}eftp_socket_state_e;

typedef struct _lxz_easyftp_t
{
	sint32 channel_id;
    sint32 it_flag_fsize;
	sint32 it_read_fsize;
	sint32 i_len_tryread;
	sint32 i_pos_tryread;
    sint32 i_len_trywrite;
    sint32 i_eof_trywrite;
    uint32 it_cmd_socket;
    uint32 it_data_socket;
    uint32 it_secs_timeout;
	sint32 it_mode_transport;
    sint32 it_code_reply;
    sint32 it_state_cmdsocket;
    sint32 it_state_datasocket;
	sint08 put_filename[EFTP_MAX_LEN_FILENAME];
	sint08 get_filename[EFTP_MAX_LEN_FILENAME];
    sint08 replyString[EFTP_REPLY_SIZE];
    sint08 pt_buf_data[EFTP_BUF_MAX_SIZE];
} lxz_easyftp_t;

lxz_easyftp_t * eftp_ftpsession_f_open(sint08 *ipAddress, uint16 ftp_port,
                                   const char *username, const char *passwd,
                                   int mode, int timeout, int ftp_type);

void eftp_ftpsession_f_close(lxz_easyftp_t *p_eftp_ctxt);
void eftp_ftpsession_f_cmdpwd(lxz_easyftp_t *p_eftp_ctxt);
int  eftp_ftpsession_f_fSize(lxz_easyftp_t *p_eftp_ctxt);

int eftp_ftpdata_f_ftpget(lxz_easyftp_t *p_eftp_ctxt,char* filename, int offset);
int eftp_ftpdata_f_ftpput(lxz_easyftp_t *p_eftp_ctxt, char * filename);
int eftp_ftpcmd_f_close(lxz_easyftp_t *p_eftp_ctxt);
int eftp_ftpdata_f_close(lxz_easyftp_t *p_eftp_ctxt);

#endif /* __LXZ_FTP_H__ */
